﻿using System;
using System.Collections.Generic;

namespace Jenvin.Library.Threading
{
    /// <summary>
    /// 不是多线程并发消费TaskActor中的任务，而是让多个TaskActor能够很好在并发。
    /// 单个TaskActor.中的Task任务顺序执行，Task只负责 将发送过来的任务，保存的在队列 中，并交由线程池执行。
    /// 强调的是TaskActor中的任务顺序执行
    /// </summary>
    public class TaskActor
    {
        private TaskContext m_taskContext = null;
        private Queue<AbstractTask> m_taskQueue = new Queue<AbstractTask>();

        public TaskActor(TaskContext context)
        {
            if (context == null)
                throw new ArgumentNullException("context");
            m_taskContext = context;
        }

        internal TaskContext Context
        {
            get
            {
                return m_taskContext;
            }
        }

        public void Post(AbstractTask task)
        {
            if (this.m_taskContext.Exited)
            {
                return;
            }

            lock (this.m_taskQueue)
            {
                this.m_taskQueue.Enqueue(task);
                this.m_taskContext.m_taskCount++;
            }

            TaskDispatcher.Instance.ReadyToExecute(this);
        }

        internal void Execute()
        {
            AbstractTask task;
            lock (this.m_taskQueue)
            {
                task = this.m_taskQueue.Dequeue();
                this.m_taskContext.m_taskCount--;
            }
            //在执行时给任务赋值一个上下文
            task.Context = this.m_taskContext;

            try
            {
                task.Execute();
            }
            catch(Exception ex)
            {
                this.Context.LastError = ex;
                throw ex;
            }
        }

    }
}
